package address.model;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;


import org.springframework.dao.DuplicateKeyException;

import board.util.Utilities;


import to.AddressTO;
import to.AddressTO2;
import to.ListTO3;
import to.PagingTO;
import address.exception.DuplicatedMemberPhoneException;
import address.model.AddressDAO;

public class AddressService {

	private AddressDAO dao;
	
	public AddressService(AddressDAO dao){
		this.dao = dao;
	}
//	public void modifyAddress(AddressTO ato) throws SQLException, DuplicatedMemberPhoneException{
//		if(dao.selectAddressByMemberPhone(ato.getMemberId(),ato.getdate1(), ato.getdate2()) != null){
//			throw new DuplicateKeyException("이미 등록된 핸드폰번호입니다. 확인 후 다시 수정하십시오.");
//		}
//		//update 처리
//		dao.updateAddress(ato);
//	}
//	public ArrayList<AddressTO> selectAllAddress(HashMap<String,Object> condition)throws SQLException{
//		return dao.selectAllAddress(condition);
//	}
//
//	public void insertAddress(AddressTO ato) throws SQLException {
//		dao.insertAddress(ato);
//		
//	}
	
	//글입력 처리를 하는 Business 메소드
		public void writeContent(AddressTO2 ato) throws SQLException{
			
			String writeDate = Utilities.getNow();
			String c = Utilities.changeContentForDB(ato.getContent());
			ato.setWritedate(writeDate);
			ato.setContent(c);
			//2
			dao.insertContentForNewCount(ato);
			//3  - 멱등처리(redirect전송)의 경우 아래 코드는 필요없음
			ato.setWritedate(Utilities.changeDayTimeFormat(writeDate));
		}
		public ArrayList<AddressTO2> getBoardAllList() throws SQLException{
			//1. dao로부터 전체 글내용을 ArrayList로 조회
			ArrayList<AddressTO2> list = dao.selectBoardAllList();
			//2 list내의 BoardDTO객체들의 writedate를 변경
			for(AddressTO2 ato:list){
				ato.setWritedate(Utilities.changeDayFormat(ato.getWritedate()));
			}
			return list;
		}
		public AddressTO2 getContentByNO(int no) throws SQLException{
			//1. 조회수 증가
			dao.updateViewCount(no);
			//2. no로 글 정보 조회
			AddressTO2 ato = dao.selectContentByNO(no);
			//2-1 writedate를 yyyy.MM.dd HH:mm:ss 형식으로 변경
			ato.setWritedate(Utilities.changeDayTimeFormat(ato.getWritedate()));
			return ato;
		}
		public AddressTO2 getContentByNoForForm(int no) throws SQLException{
			//1. no값으로 글 조회
			AddressTO2 ato = dao.selectContentByNO(no);
			//2. content를 textarea용으로 변경
			ato.setContent(Utilities.changeContentForTextArea(ato.getContent()));
			return ato;
		}
		public void modifyContent(AddressTO2 ato) throws SQLException{
			//1. property변경 - content, writedate
			ato.setContent(Utilities.changeContentForDB(ato.getContent()));
			ato.setWritedate(Utilities.getNow());
			//2. 수정 처리
			dao.updateContent(ato);
			//3. writedate 포멧 변경 - 멱등처리(redirect전송)의 경우 아래 코드는 필요없음
			ato.setWritedate(Utilities.changeDayTimeFormat(ato.getWritedate()));
		}
		public void deleteContentByNO(int no) throws SQLException{
			dao.deleteContentByNO(no);
		}
		public void replyContent(AddressTO2 ato) throws SQLException{
			//1. DB에 같은 refamily의 restep들을 1씩 증가시킨다.
			dao.updateRestep(ato.getRefamily(), ato.getRestep());
			//2. ato의 restep, relevel을 1 증가시킨다.
			ato.setRestep(ato.getRestep()+1);
			ato.setRelevel(ato.getRelevel()+1);
			//3. insert할 글 번호를 가져온와 ato에 넣는다. 
			//4. BoardDTO에 no, writeDate와 content는 DB 저장용으로 변경한다.
			
			
			ato.setWritedate(Utilities.getNow());
			ato.setContent(Utilities.changeContentForDB(ato.getContent()));
			//5. 새글 등록 - dao.insertContent() 이용
			dao.insertContentForReply(ato);
			
			//6. 날짜 형태 show_content.jsp에서 보여주도록 년.월.일 시:분:초 로 변경 - 멱등처리(redirect전송)의 경우 아래 코드는 필요없음
			ato.setWritedate(Utilities.changeDayTimeFormat(ato.getWritedate()));
		}
		//페이징 리스트 조회
		public ListTO3 getBoardListByPage(int page) throws SQLException{
			//1. dao로부터 전체 글내용을 ArrayList로 조회
			ArrayList<AddressTO2> list = dao.selectBoardListByPage(page);
			//2 list내의 BoardDTO객체들의 writedate를 변경
			for(AddressTO2 ato:list){
				ato.setWritedate(Utilities.changeDayFormat(ato.getWritedate()));
			}
			//3. PagingDTO객체를 생성
			// 	3.1. - dao.selectTotalContent() - 총게시물 수를 리턴
			int totalContent = dao.selectTotalContent();
			PagingTO pagingTO = new PagingTO(totalContent, page);
			//4. ArrayList, PagingDTO객체를 이용해 ListDTO를 생성해서 return
			ListTO3 lto = new ListTO3(list, pagingTO);
			return lto;
		}
	
}
